package bancosys.tec.persist.hibernate.impl;

import java.io.Serializable;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 * Representa uma dependencia para a mesma classe ou subclasse.
 * 
 * @author takeshi
 */
public class HibernateSelfDependency extends HibernateEntityDependency {

    /**
     * C'tor
     * 
     * @param dependente a classe que possui o relacionamento
     * @param dependencia a classe 'alvo' - a entidade que se quer apagar
     * @param path o caminho - geralmente nome da propriedade
     */
    public HibernateSelfDependency(Class<?> dependente, Class<?> dependencia, String path) {
        super(dependente, dependencia, path);
    }

    /**
     * Cria uma {@link Criteria} que lista todas as dependencias
     * 
     * @param session a {@link Session}
     * @param idDependencia o id da dependencia
     * @return {@link Criteria}
     */
    @Override
    protected Criteria createBaseQuery(Session session, Serializable idDependencia) {
        return session.createCriteria(this.getDependente()).add(
                Restrictions.not(Restrictions.idEq(idDependencia))).createCriteria(this.getPath())
                .add(Restrictions.idEq(idDependencia));
    }

}
